"""
# BeautifulSoup
简单来说，Beautiful Soup 是 python 的一个库，最主要的功能是从网页抓取数据。官方解释如下：
    Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。
    它是一个工具箱，通过解析文档为用户提供需要抓取的数据，因为简单，所以不需要多少代码就可以写出一个完整的应用程序。
    Beautiful Soup 自动将输入文档转换为 Unicode 编码，输出文档转换为 utf-8 编码。
    你不需要考虑编码方式，除非文档没有指定一个编码方式，这时，Beautiful Soup 就不能自动识别编码方式了。
    然后，你仅仅需要说明一下原始编码方式就可以了。
    Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器，为用户灵活地提供不同的解析策略或强劲的速度。

缺点：
    优缺点？
        缺点：效率没有lxml的效率高
        优点：接口设计人性化，使用方便

安装：
    1.安装pip install bs4
    2.导入from bs4 import Beautifulsoup
    3.创建对象
        服务器响应的文件生成对象
            soup = Beautifulsoup(response.read().decode(),'lxml')
        本地文件生成对象
            soup =Beautifulsoup(open('1.html'),'lxml')
        注意：默认打开文件的编码格式gbk所以需要指定打开编码格式
"""

from bs4 import BeautifulSoup

# 解析本地文件
# 注意：默认打开的编码是gbk 所以需要指定打开编码格式
soup = BeautifulSoup(open('22.解析_BeautifulSoup.html', encoding="utf-8"), 'lxml')

# 获取第一个符合条件的标签
# print(soup.a)

# 获取标签的属性或者属性值
# print(soup.a.attrs)

# bs4的一些函数
# (1) find 返回第一个符合条件的标签
# print(soup.find('a', title='a2'))
# print(soup.find('a', id='a2'))
# print(soup.find('a', class_='a1'))  # class_需要注意的是class要加下划线

# (2) find_all 返回所有符合条件的标签
# print(soup.find_all("a"))  # 单标签
# print(soup.find_all(["a", "span"]))  # 多标签（a和span）
# print(soup.find_all("a", limit=2))  # limit 参数（查找前n个数据）

# (3) select 返回所有符合条件的标签 (bs推荐的方式)
# print(soup.select('a'))  # select方法返回的是一个列表，并且是多个数据
# print(soup.select('.a1'))  # 就是前端的类选择器
# print(soup.select('#a1'))  # 就是前端的id选择器

# (3.1) 属性选择器
# 查找里标签中有属性为href的标签
# print(soup.select('a[href]'))

# 查找里标签中有属性为href="www.baidu.com"的标签
# print(soup.select('a[href="www.baidu.com"]'))

# (3.2) 层级选择器
# 后代选择器 找到div下面的li
# print(soup.select('div li'))

# (3.3) 子代选择器 找到div下面的直接子标签
# 注意：很多计算机语言中不加空格中会报错，但是在bs4中不会报错
# print(soup.select('div > ul > li'))

# (3.4) 获取所有的a标签和li标签
# print(soup.select('a,li'))


# (4) 节点信息
# (4.1) 获取节点内容
# obj = soup.select('#d1')
# print(obj[0].string)  # 当只有一个节点的时候，返回的是字符串（多个节点返回的是对象，不能提取字符串）
# print(obj[0].get_text())  # 【推荐】

# (4.2) 节点属性
# obj = soup.select('#p1')
# print(obj[0].name)  # name 是标签的名称
# print(obj[0].attrs)  # attrs 是将属性值作为一个字典返回

# (4.3) 获取节点文属性
obj = soup.select('#p1')
print(obj[0].attrs.get("class"))  # 通过get获取字典中的数据
print(obj[0].get("class"))
print(obj[0]["class"])
